let obj = { //定义一个对象
    name:"ZengYuJie",
    age:"18"
}

Object.prototype.gender = '男' //在对象中原型链上挂载一个属性

Object.defineProperty(obj,'test',{  //这样定义的属性是属于自身属性而不是原型链上的属性
    value:'test',
    enumerable:false, //设置不可枚举,只有这一种方式可以设置不可枚举
})


//Object.keys  获取自己身上的可枚举属性,不包含symbol,返回一个数组
console.log('Object.keys',Object.keys(obj))
//object.values 获取自己身上的可枚举属性值,不包含symbol,返回一个数组
console.log('Object.values',Object.values(obj))
//object.entires 获取自己身上可枚举的[属性名:属性值] 形成的数组
console.log('Object.entries',Object.entries(obj))


//使用for-of配合Object.entires
for([a,b] of Object.entries(obj)){
    console.log(a)
    console.log(b)
}

//Object.getOwnPropertyName  获取自身所有的键名,包含不可枚举(也就是上面定义的test),不包含symbol,返回一个数组
console.log('Object.getOwnPropertyNames',Object.getOwnPropertyNames(obj))

//Object.getOwnPropertySymbols 获取自身所有的symbol属性,不包含不可枚举,返回一个数组 ------------symbol后面学习

//Reflect.ownKeys 获取自身所有的键名,包含不可枚举(也就是上面定义的test),包含symbol,返回一个数组
console.log('Reflect.ownKeys',Reflect.ownKeys(obj))



// object实现对象遍历的方式都不能遍历原型链上的属性
// 想要遍历原型链上的属性可以使用for-in 或者 Object.getPrototypeOf(obj)


// Object.getOwnPropertyDescriptor 获取对象自身属性的描述符
// 返回一个对象，包含以下属性：
// - value: 属性值
// - writable: 是否可写
// - enumerable: 是否可枚举
// - configurable: 是否可配置
// - get: getter函数（如果有）
// - set: setter函数（如果有）

console.log('Object.getOwnPropertyDescriptor(obj, "name")', Object.getOwnPropertyDescriptor(obj, 'name'))
console.log('Object.getOwnPropertyDescriptor(obj, "test")', Object.getOwnPropertyDescriptor(obj, 'test'))
console.log('Object.getOwnPropertyDescriptor(obj, "gender")', Object.getOwnPropertyDescriptor(obj, 'gender'))

// 获取所有自身属性的描述符
const allDescriptors = Object.getOwnPropertyDescriptors(obj)
console.log('Object.getOwnPropertyDescriptors(obj)', allDescriptors)

// 使用描述符创建新对象
const newObj = Object.create(null, allDescriptors)
console.log('使用描述符创建的新对象:', newObj)




